package logger

import (
	"fmt"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"os"
	"time"
)

const (
	logDir = "logs"
)

func init() {
	// 初始化必要目录
	err := initDir()
	if err != nil {
		fmt.Printf("init dir failed: %v\n", err)
		return
	}

	// 生成当前时间戳
	now := time.Now()
	timestamp := now.Format("2006-01-02T15-04-05")

	// 将时间戳插入到文件名中
	logFileName := fmt.Sprintf("%s/%s.log", logDir, timestamp)

	// 初始化日志
	err = initGlobalLogger(logFileName)
	if err != nil {
		fmt.Printf("init logger failed: %v\n", err)
		return
	}

	return
}

func initGlobalLogger(logFilePath string) error {
	// 参数检测
	if logFilePath == "" {
		println("log file path is empty, init logger failed")
		return nil
	}

	// 创建文件输出
	file, err := os.Create(logFilePath)
	if err != nil {
		fmt.Printf("create log file failed: %v\n", err)
		return err
	}

	// 设置日志编码器
	encoderConfig := zap.NewDevelopmentEncoderConfig()
	encoderConfig.TimeKey = "T"   // timestamp
	encoderConfig.CallerKey = "C" // caller
	encoder := zapcore.NewJSONEncoder(encoderConfig)

	// 创建两个zapcore（控制台和文件）
	consoleCore := zapcore.NewCore(encoder, zapcore.AddSync(os.Stdout), zapcore.DebugLevel)
	fileCore := zapcore.NewCore(encoder, zapcore.AddSync(file), zapcore.WarnLevel)

	// 将两种输出合并
	core := zapcore.NewTee(consoleCore, fileCore)

	// 创建logger，并替换全局logger
	logger := zap.New(core, zap.AddCaller())
	// 使用全局logger来设置日志记录器
	zap.ReplaceGlobals(logger)

	zap.L().Sugar().Info("log init success")

	return nil
}

func initDir() error {
	// 创建日志目录
	err := os.MkdirAll(logDir, os.ModePerm)
	if err != nil {
		fmt.Printf("create logs directory failed: %v\n", err)
		return err
	}

	return nil
}
